import { checkLogin } from '../utils/auth.js';

/**
 * auth指令
 * 用于控制需要登录权限的UI元素
 */

// 使用方法：v-auth:click.redirect="someMethod"
// 参数说明：
// - 参数值：元素绑定的方法
// - 修饰符：
//   - redirect: 未登录时是否自动跳转到登录页
//   - silent: 是否不显示提示信息
//   - force: 是否强制检查，即使先前的检查已经通过

export default {
    mounted(el, binding) {
        const { arg, value, modifiers } = binding;

        // 绑定的事件类型，默认为click
        const eventType = arg || 'click';

        // 配置选项
        const options = {
            redirect: !!modifiers.redirect,
            showToast: !modifiers.silent,
            toastMessage: modifiers.silent ? '' : '请先登录后再操作'
        };

        // 保存原始方法
        const rawMethod = typeof value === 'function' ? value : () => { };

        // 创建包装方法
        const wrappedMethod = function (...args) {
            if (checkLogin(options)) {
                return rawMethod.apply(this, args);
            }
            return false;
        };

        // 绑定事件
        el.__auth_handler__ = wrappedMethod;
        el.addEventListener(eventType, wrappedMethod);
    },

    // 更新指令
    updated(el, binding) {
        const { arg, value, modifiers } = binding;

        // 绑定的事件类型，默认为click
        const eventType = arg || 'click';

        // 如果方法发生变化，需要重新绑定
        if (typeof value === 'function' && el.__auth_raw_method__ !== value) {
            // 移除旧事件
            el.removeEventListener(eventType, el.__auth_handler__);

            // 保存原始方法
            el.__auth_raw_method__ = value;

            // 配置选项
            const options = {
                redirect: !!modifiers.redirect,
                showToast: !modifiers.silent,
                toastMessage: modifiers.silent ? '' : '请先登录后再操作'
            };

            // 创建包装方法
            const wrappedMethod = function (...args) {
                if (checkLogin(options)) {
                    return value.apply(this, args);
                }
                return false;
            };

            // 绑定新事件
            el.__auth_handler__ = wrappedMethod;
            el.addEventListener(eventType, wrappedMethod);
        }
    },

    // 解绑指令
    unmounted(el, binding) {
        const eventType = binding.arg || 'click';
        if (el.__auth_handler__) {
            el.removeEventListener(eventType, el.__auth_handler__);
            delete el.__auth_handler__;
            delete el.__auth_raw_method__;
        }
    }
}; 